package com.liuyou.templatemethod;

public abstract class SoyaMilk {
    public final void make() {
        select();
        if (whetherToAddIngredients()) {
            add();
        }
        soak();
        beat();
    }

    // TODO 注意: 推荐将template method调用的方法设置为protected方法

    protected void select() {
        System.out.println("选择黄豆");
    }

    protected abstract void add();

    protected void soak() {
        System.out.println("浸泡");
    }

    protected void beat() {
        System.out.println("打浆");
    }

    /**
     * 钩子方法 决定是否添加配料
     * <p>
     * 钩子方法是子类可以控制部分父类模板方法的流程，这里如果override父类的钩子方法，其实是对
     * 模板方法中流程的控制。要么执行，要么不执行。
     *
     * @return boolean
     */
    protected boolean whetherToAddIngredients() {
        return true;
    }
}
